AWS IoTでコネクテッドデバイスのモバイルアプリを実装する #アドカレ2015
ども、大瀧です。
AWSモバイルアドベントカレンダー12日目の記事になります。
今回はコネクテッドデバイスを操作するモバイルアプリをAWS IoTを使って開発する構成をご紹介します。
概要
コネクテッドデバイスは、インターネットに接続することを前提に設計されたデバイスです。インターネットに接続することで遠隔のアプリケーションから操作したり、ソフトウェアアップデートで機能追加できるなどで注目されています。Philips Hueなどが有名ですね。
コネクテッドデバイスのモバイルアプリは、下図のようにクラウドを介してデバイスと通信する形になります。
AWSには様々なサービスがありますが、今回はAWS IoTのDevice Shadowという機能を利用してみます。Device Shadowは以下のようなJSONドキュメントの保管とその差分通知、バージョン管理機能を持ちます。
{ "state": { "reported": { "light": "off" } } }
JSONドキュメントには、デバイスの現在の状態(Reported State)とあるべき状態(Desired State)をそれぞれ保存します。AWS IoTではDevice Shadowをデバイスごとに持つことができるので、モバイルアプリはReported Stateでデバイスの現在の状態を読み取ることができ、Desired Stateを書き換えてデバイスの操作を行います。対してデバイスではDesired Stateを読み取ってモバイルアプリからの操作を確認し、Reported Stateに自身の状態を報告するというわけです。
Device Shadowの概念についてはこちらのブログ記事、デバイスのコード例はこちらのブログ記事を参照してください。
モバイルアプリからAWS IoTへのアクセス
Device Shadowへのアクセスには、AWS IoTのMQTT APIとWeb APIが利用できます。MQTT APIへのアクセスにはX509証明書が必要ですが、モバイル端末にそれを個別配布するのは難しい *1ので、Web APIを検討してみます。
Web APIは他のAWSサービス同様にAPIキー、シークレットキーを用いたRESTful APIですので、AWS SDKを利用するのが正攻法でしょう。Cognitoを組み合わせた一時認証キーを利用するとモバイル端末にAPIキーを配置せずに済みます(下図の青線)。
また、アプリ側の実装をよりシンプルにしたいのであれば、API Gateway経由でLambdaからAWS IoTを呼び出す構成もあります(下図の赤線)。API Gatewayには通常のHTTPSリクエストでアクセスできますし、API GatewayにAPIキーを設定すれば最低限の認証を含めることもできます *2
実際のコードは、アドベントカレンダー11日目の田中の記事がまるっと使えます(LambdaのコードにDevice Shadowへの接続処理が入ります)。
なお、AWS IoTのAPIはDevice Shadow関係のみIoT Dataという別サービス扱いになっているので、APIリファレンスを参照するときは気をつけましょう。AWS CLIも、aws iot-data <サブコマンド>
を利用します。
まとめ
あまり具体的なコードが提示できず恐縮ですが、モバイルアプリでAWS IoTのDevice Shadowを扱う概念は理解いただけたのではないでしょうか。
明日(というか今日)は、藤村のLambdaネタです!お楽しみに!
脚注
- SORACOM Beamといった認証プロキシを利用する方法もあります ↩
- こちらもSORACOM BeamでAPIキーによる認証をプロキシできます。 ↩